#include "utils/logger.h"
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <memory>

/**
 * @class Logger
 * @brief 交易系统日志管理类
 * @details 基于spdlog实现的多线程安全日志系统，支持同时输出到文件和终端
 */
std::shared_ptr<spdlog::logger> Logger::s_logger = nullptr;

/**
 * @brief 初始化日志系统
 * @param filename 日志文件名
 * @param max_size 单个日志文件最大大小(字节)
 * @param max_files 最大保留日志文件数
 * @throws std::runtime_error 当日志初始化失败时抛出
 * @details 创建同时输出到文件和终端的日志记录器，并设置日志格式和级别
 */
void Logger::init(const std::string& filename, size_t max_size, size_t max_files) {
    try {
        // 创建文件轮转日志记录器
        auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
            filename, max_size, max_files);
        
        // 同时输出到控制台
        auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
        
        // 创建组合sink的logger
        s_logger = std::make_shared<spdlog::logger>("trading", 
            spdlog::sinks_init_list{file_sink, console_sink});
        
        // 设置日志格式
        s_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [thread %t] %v");
        
        // 设置默认日志级别
        s_logger->set_level(spdlog::level::info);
        
        // 注册logger
        spdlog::register_logger(s_logger);
        
        // 刷新错误时立即输出
        spdlog::flush_on(spdlog::level::err);
        
    } catch (const spdlog::spdlog_ex& ex) {
        throw std::runtime_error(std::string("Log initialization failed: ") + ex.what());
    }
}